#include "user_uart.h"
#include "ringbuffer.h"
/**
 * @brief 用户自定义串口重定向
 * @param huartx 
 * @param format 
 * @param ... 
 * @return none
 */
int user_printf(UART_HandleTypeDef *huart,char* format,...)
{
    char buffer[512];//临时存储格式化后字符
    va_list arg;//处理可变参数
    int len;//最终字符串长度

    va_start(arg,format);
    //格式化字符串到buffer
    len = vsnprintf(buffer,sizeof(buffer),format,arg);
    va_end(arg);

    //调用接口实现重定向
    HAL_UART_Transmit(huart,(uint8_t *)buffer,(uint16_t)len,0xff);
    return len;
}
/*超时解析方案*/
uint8_t uart_rx_buffer[BUFFER_SIZE];//超时解析方案 数据接收数组
uint32_t uart_tick;//超时解析方案，串口接收数据时间戳
uint8_t uart_rx_index;//超时解析方案,串口接收缓冲区索引
/*dma空闲中断方案*/
uint8_t uart_dma_buffer[BUFFER_SIZE];//dma空闲中断方案，数据接收缓冲区
uint8_t uart_dma_flag;//dma空闲中断方案,数据搬运完成标志位
/*dma+ringbuffer+空闲中断方案*/
struct rt_ringbuffer uart_ringbuffer_t;//ringbuffer结构体
uint8_t uart_ringbuffer_pool[BUFFER_SIZE];//ringbuffer数据池
/**
 * @brief 串口接收完成中断回调函数
 * @param huart 
 * @return none
 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART3)
    {
        //更新接受数据时间戳
        uart_tick = HAL_GetTick();
        //更新接受数组索引
        uart_rx_index++;
        if(uart_rx_index >= BUFFER_SIZE)
            uart_rx_index = 0;
        //重新启动串口中断接收
        HAL_UART_Receive_IT(&huart3,&uart_rx_buffer[uart_rx_index],1);
    }
}
/**
 * @brief 串口接收空闲中断
 * 
 * @param huart 
 * @param Size 
 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t Size)
{
    if(huart->Instance == USART3)
    {
        //关闭DMA接收,防止缓冲区数据出错
        HAL_UART_DMAStop(&huart3);
        //将dma缓冲区数据放入读取缓冲区(dma+空闲中断方案)
        //memcpy(uart_read_buffer,uart_dma_buffer,sizeof(uart_dma_buffer));
			
        //ringbuffer+dma+空闲中断方案
        rt_ringbuffer_put(&uart_ringbuffer_t,uart_dma_buffer,sizeof(uart_dma_buffer));
        //拉高数据缓存成功标志位
        //uart_dma_flag = 1;
        //清空dma缓冲区为下一次接收做准备
        memset(uart_dma_buffer,0,sizeof(uart_dma_buffer));
        //再次打开dma为下一次接收做准备
        HAL_UARTEx_ReceiveToIdle_DMA(&huart3,uart_dma_buffer,sizeof(uart_dma_buffer));
        __HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);
    }
}

